ランダム評価を用いたPCS multiproofs
多項式コミットメントの多重証明スキーム
この記事では、(加法的同型性を持つ)多項式コミットメントスキームの多重証明スキームについて説明します。この方式は、検証が非常に効率的であり、また、すべての多項式が完全に利用可能である限り、証明計算も効率的である
検証者の主要な操作は1回の多項式演算だけ
データにアクセスすることなく、証明のみから集計を行わなければならない場合には適していない
そのため、弱いステートレスを実現する目的でのverkle triesの設定には非常に強力
KZGコミットメント方式は、2つのコミットメントを足して2つの多項式の和への公約を得ることが可能な、あらゆる「加法的同型」の方式にも有効なので、Inner product argument (bulletproofsの中核となる議論)にも適用可能であり、実際にこのユースケースでは非常に強力な集約スキームとなっている
ランダム評価を使用したVerkle multiproofs
問題:幅dのVerkle trieにおいて,すべての中間KZG(「Kate」)証明をできるだけ効率的に提供したい.
すべての中間的なcommitmentを提供する必要があり、Verkle trieではそれを回避する方法はないが、単一のKZG証明に最適化できる。KZGについては、すべての証明が検証者に与えられれば、効率的な多重検証技術があるが、できるだけ少ない定数の証明で済ませたいのですわ
verkle triesへの接続
https://scrapbox.io/files/60ee8778d177730022f57961.png
葉のvalue 0101 0111 1010 1111 -> 1213(緑)を証明するためには、ノードAとノードB(シアン)にコミットメントを与え、さらに以下のKZG証明をしなければならない。
ノード0101 0111 1010 1111 -> 1213のルート(キーと値のハッシュ)が,インデックス1010におけるインナーノードBのコミットメントの評価であることの証明
インナーノードBのルート(KZGコミットメントのハッシュ)が,インデックス0111におけるインナーノードAのコミットメントの評価であることの証明
インナーノードAのルート(KZGコミットメントのハッシュ)がインデックス0101におけるルートのコミットメントの評価であることの証明
これらのコミットメントを$ C_0(インナーノードB)、$ C_1(インナーノードA)、$ C_2(ルート)と呼ぶことにすると
(ルート)は、多項式関数$ f_i(X)に対するものであり、コミットメント$ C_iがインデックス$ z_iである$ y_iと評価されるという主張で実際に言っていることは、$ C_iによってコミットされた関数、すなわち$ f_i(X)はインデックス$ z_iで$ y_iと評価されるということ
$ f_0(ω^{0b1010})=H(0101 01111010 1111,1213) (キーと値のハッシュ)
ここで$ C_0=[f_0(s)]_1 、すなわち$ C_0は$ f_0(X)へのコミットメントである。
$ f_1(ω^{0b0111})=H(C_0) 、ここで$ C_1=[f_1(s)]_1
$ f_2(ω^{0b0101})=H(C_1) 、ここで$ C_2=[f_2(s)]_1
なお、インデックスを$ z_i=ω^{the\ index} のように置き換えた
ωはd-th root of unityで、これにより多くの演算が実際にはより効率的になる
Hは衝突耐性のあるハッシュ関数を意味し、例えばsha256など
もしツリーの内側にノードがあれば(パスの内側のノードが多ければ)、提供すべき証明の数は増える。
また、複数のキーと値のペアに対して同時に証明を行うマルチプルーフを行うと、証明のリストはさらに長くなり、最終的には、$ C_i=[f_i(s)]_1 というコミットメントを持つ$ f_i(z_i)=y_i という形式の評価を何百、何千と証明することになる
証明との関係
verkle multiproof(同時に多くの葉を証明するverkle proof)の中心部分は、次の関係を証明すること
まず、$ m 個のKZG commitments $ C_0 =[f_0(s)]_1 ,...,C_{m-1} = [f_{m-1}(s)]_1 は以下のように与えられる
$ f_0(z_0)=y_0
$ f_{m-1}(z_{m-1})=y_{m-1}
ここで、$ z_i \in {ω^0,・・・,ω^{d-1}}であり、ωはd-th root of unityである。
証明
$ rを$ r←H(C_0,...,C_{m-1},y_0,...,y_{m-1},z_0,...,z_{m-1})と定義する
このとき、証明者は以下の計算を実行する。
$ g(X)= r^0 \frac{f_0(X)-u_0}{X-z_0}+r^1 \frac{f_1(X)-u_1}{X-z_1}+・・・+r^{m-1} \frac{f_{m-1}(X)-u_{m-1}}{X-z_{m-1}}
u is なに?
これ、全てのインデックスにおけるなに?
KZG Commitmentによってコミットできる関数はすべて多項式なので、$ g(X)が実際に(有理関数ではなく)多項式であることを証明できれば、すべての商がインデックスごとの正確な分割であることを意味し、したがって証明は完了する。
これは、商のランダムな線形結合なことに由来する。もし、商をただ足すだけなら、2つの商がその余りを「相殺」して多項式になるだけということもありえる
しかし、$ rはすべての入力が確定した後に選ばれるので(Fiat-Shamirヒューリスティックを参照)、余剰の2つが相殺されるような入力を見つけることは、証明者にとって計算上不可能である。
なるほど、rってそういう意味ね
それ以外の議論は、$ g(X)が多項式であること(有理関数ではないこと)を、証明者と検証者が最小限の労力で証明することが中心となる。
そこで、証明者はコミットメント$ D=[g(s)]_1 を計算して送信する。あとは、$ Dが本当に関数$ g(X)に対するコミットメントであることを検証者に納得させるだけ
多項式(コミットメント)のコミットメント的な
1.
コミットメント$ Dの正しさを、(1)完全にランダムな点tで評価し、(2)その評価が確かに$ g(t)であることを検証者が確認することによって証明-検証は完了する
$ t←H(r,D)とすると、$ g(t)を評価し、検証者が次の方程式を評価するのを支援することになる。
$ $ g(t)=\sum^{m-i}_{i=0}{r^i}\frac{{f_i}(t)-y_i}{t-z_i}
上式を2つに分割すると次のようになる
$ g(t)=\underbrace{\sum^{m-i}_{i=0}{r^i}\frac{{f_i}(t)}{t-z_i}}_{g_1(t)}-\underbrace{\sum^{m-i}_{i=0}{r^i}\frac{y_i}{t-z_i}}_{g_2(t)}
第2項$ g_2(t)は、検証者に完全に知られており、少数のフィールド操作で計算することができる
第1項は、コミットメントにオープニングを与えることで計算できる(?)
$ E=\sum^{m-i}_{i=0}\frac{{r^i}}{t-z_i}C_i
これは、$ E=[h(s)]_1 を満たす
1.証明者は多項式評価$ y=h(t) と$ ω=g(t) に加え、以下の二つのKZG proofs
$ π=[(h(s)-y)/(s-t)]_1
$ ρ=[(g(s)−w)/(s−t)]_1
を計算する。これらの証明は$ D,y,π,ρ で構成される
検証
1つのグループ要素を保存するための変更
上記の両方のKZG proofsは同じ点にあるため、それらを集約して1つのグループ要素と1つのペアとして保存できる
なんで、、同じ点ならそれができる?
$ q=H(E,D,y,ω)
を計算し、$ σ=π+qρ と定義すると、完全なproofは以下の式を検証することで確かめることができる
$ e(E-[y]_1 + q(D-[ω]_1),[1]_2 ) = e(σ,[s-t]_2)
この証明はそれゆえ、$ D,$ y,$ σ(BLS12-381で128Byte)の3つの要素だけで構成される。
最適化:評価形式ですべてを行う
上記のバージョンのKZG multiproofの大きな利点は、証明者と検証者の作業の大部分をその場で行うだけで済むというもの
さらに、これらの操作はすべて、多項式の評価形式(数学用語で言うと「ラグランジュ基底」)で行うことができる。
これが何を意味するのか、どのように使われるのかを以下に説明する
評価形式
一般的に、多項式を係数$ c_0,c_1,...,における関数$ f(X)=\sum_i{C_iX^i}とみなす。
ここでは、多項式を見るもう一つの方法、いわゆる「評価形式」を定義する
常にユニークで$ degree<dな多項式$ fのd個の点$ (ω^0,y_0),...,(ω^{d-1},y_{d-1})を定義する。
つまり、全ての$ 0≦i≦dにおいて$ f(ω^i)=y_iとなる。逆に言えば、多項式が与えられれば、d の根での評価を簡単に計算することができる。
$ {all polynomicals of degree < d }↔︎{vectors of length d, seen as evaluations of a polynomial at ω^i}
このようにして、次のような一対一の対応が成り立ちます。
これは、「基底の変更」と見ることができます。左側では基底は「多項式の係数」であるのに対し、右側では「$ ω^i上での多項式の評価」となります。
多くの場合、評価形式の方が自然です。例えば、KZGをベクトル・コミットメントとして使用する場合、$ f(ω^i)=y^iで定義される関数にコミットすることで、ベクトル[$ (y_0,...,y_{d-1})にコミットすることになりますが、評価形式にはより多くの利点があります。2つの多項式の乗算や除算(除算が厳密な場合)などの一部の演算は、評価形式の方がはるかに効率的です。
実際、上述のKZG多項式のすべての演算は、評価形式で非常に効率的に行うことができます。
ラグランジュ多項式
ラグランジュ多項式を定義しましょう
$ ℓ_i(X)=\prod_{i≠j}\frac{X-ω^ij}{ω^i-ω^j}
全ての$ x∈ω^0,...,ω^{d-1}について
$ ℓ_i(x) = \left\{ \begin{array}{l}\displaystyle {1} \;\;\; (\; x=ω^i ) \\0 \;\;\; ( otherwise )\end{array} \right.
したがって、ラグランジュ多項式は、評価形式の多項式の「単位ベクトル」と見なすことができます。例えば、評価形式の多項式として$ (y_0,...,y_{d-1})が与えられた場合、その多項式は次のようになります。
$ f(X)=\sum^{d-1}_{i=0}{y_il_i(X)}
評価形式の多項式は、これにちなんで「ラグランジュ基底の多項式」と呼ばれる
KZG commitmentについては、別のトリックを使うことができます。を思い出してください。G 1 次数の多項式にコミットするためのKZGの設定が < k 以下の構成となっています。$ [ s _i]_1,0≤i<d , これらから$ [ℓ_i(s)]1,0≤i<d, と計算できるので、単純に次のように多項式の約束を計算することができます。
$ [f(s)]_1 = \sum^{d-1}_{i=0} y_i[ℓ_i(s)]_1
評価形式と係数形式の間で変更するFFT
ベクトル$ vの離散フーリエ変換$ u=DFT(v)は以下のように定義される
$ u_i= \sum^{d-1}_{j=0}{v_jω^{ij}}
$ f(X)=\sum^{k-1}_{j=0}{v_jX^j} を定義した場合、$ u_i= f(ω^i) となる。つまりDFTは$ 0≦i≦d におけるドメイン$ ω^i$ f(X)の値を計算するが、実際にはほとんどの場合、この特定の領域(単一根)を使用します。なぜなら、DFTを使用して係数形式から評価形式を計算できるからです。
ここで、逆フーリエ変換$ v_i=DFT^{-1}(u_i)はつぎのように定義されます
$ v_i=\frac{1}{d} \sum^{d-1}_{j=0}{u_jω^{-ij}}
要約すると「係数形式 $ DFT⇆DFT^{-1} 評価形式
DFTが多項式の評価値を係数形式で計算するのと同様に、逆DFTは多項式の評価値からその係数を計算します。
高速フーリエ変換は、DFTまたは逆DFTをわずか$ \frac{d}{2}logdの乗算で計算することができる高速アルゴリズムです。上の和を直接実装すると $ d^2回の乗算が必要になります。このスピードアップは非常に大きく、FFTを強力なツールにしています。
厳密には,DFTは演算の総称であり,FFTはそれを実装するためのアルゴリズムである(sortが演算であり,quicksortがその演算を実装するための1つの可能なアルゴリズムであるのと同様である)。しかし、口語では、演算とアルゴリズムの両方を意味する場合でも、FFTと言うことが非常に多い。
多項式の乗算と除算
次数の合計が$ kより小さい2つの多項式$ f(X)と$ g(X)があるとすると、積$ h(X)=f(X)・g(X)は次数が$ kより小さい多項式である。
$ g(X)は次数が$ k未満の多項式であるとすると、評価値$ f_i=f(ω^i)と g_i=g(ω^i)の評価値があれば、積の評価値を簡単に計算することができる
$ h_i=h(ω^i)=f(ω^i)g(ω^i)=f_ig_i
係数形式での乗算が$ O(d2)回の乗算を必要とするのに対し、$ d回の乗算で済む。つまり、2つの多項式の掛け算は、評価形式の方がはるかに簡単である。
ここで、$ g(X)が$ f(X)を正確に分割すると仮定する、すなわち、$ f(X)=g(X)q(X)となるような多項式$ q(X)
があるとすると、この商$ q(X)を以下の評価形式で求めることができる。
$ q_i=q(ω_i)=f(ω_i)/g(ω_i)=f_i/g_i
これは、$ d個の割り算だけで求められる。ここでも長い除算を用いれば、係数形式で$ O(d2)回の演算が必要となり、はるかに困難な作業となる。
このトリックは、多項式の商を計算しなければならない評価形式のKate Commitmentの開きを計算するのにも使える。そこで、このトリックを使って、上の証明$ πと$ ρを計算してみよう
ポイントの1つがゼロのときに分割する
$ g_iの片方がゼロの場合、つまり$ g(X)が評価領域のどこかでゼロになっている場合はどうなるのか?
定義上、これは$ f_iもゼロである場合にのみ起こる。そうでなければ、$ g(X)は$ f(X)を割り切れない。
しかし、両方がゼロであれば、$ q_i=0/0が残り、評価形式で直接計算することはできない。
多くの場合、$ g(X)=X-ω^mは線形因子であるから
$ q(X)=\frac{f(X)}{g(X)}=\frac{f(X)}{X-ω^m}=\sum^{d-1}_{i=0}{f_i}\frac{l_i(X)}{X-ω^m}
ここで、多項式$ A(X)=X^d-1を導入すると、多項式の根は、$ A(ω^i)=ω^{id}-1=1-1=0であるため、実際には、単一の$ ω^iの根となる。したがって、$ A(X)を別の形で書くと
$ A(X)=x^d-1=\prod^{d-1}_{i=0}{X-ω^i}
Aの形式微分は次のように与えられる
$ A'(X)=dx^{d-1}=\sum^{d-1}_{j=0}\prod_{i≠j}{X-ω^i}
$ A′(ω^i)が必要になりますが、これは次のように簡単に計算できる
$ A'(X)=d(ω^i)^{d-1}=dω^{-1}
この多項式は、ラグランジュ多項式を次のように記述できる
$ ℓ_i(X)=\frac{1}{A^′(ωi)}\frac{A(X)}{X−ω^i}=\frac{1}{dω^{−i}}\frac{A(X)}{X−ω^i}=\frac{ω^i}{d}\frac{A(X)}{X−ω^i}
つまり
$ \frac{l_i(X)}{X-ω^m}=\frac{ω^i}{d}\frac{A(X)}{(X−ω^i)(X−ω^m)}=\frac{ω^i}{ω^m}\frac{l_m(X)}{(X−ω^i)}
さて、$ q(X)の式に戻りましょう。これを評価形式で求める場合に問題となるのは、ゼロによる除算が発生する点$ q(ω^m)だが、その他の点はすべて簡単に計算できる
$ q(X)=\sum^{d-1}_{i=0}f_i\frac{l_i(X)}{X-ω^m}\frac{ω^i}{ω^m}\frac{l_im(X)}{X-ω^m}
$ ℓ_m(ω^m)=1なので、
$ q_m=q(ω^m)=\sum^{d-1}_{i=0}f_i\frac{ω^i}{ω^m}\frac{1}{ω^m-ω^i}\sum^{d-1}_{i=0}f_i\frac{ω^{i-m}}{ω^m-ω^i}
すべての$ j≠mについて、直接計算すると
$ q_j=q(ω^j)=\sum^{d-1}_{i=0}f_i\frac{l_i(ω^j)}{ω^j-ω^m}=\frac{f_j}{ω^j-ω^m}
これにより、$ j=mを含むすべての$ jに対して、すべての$ q_jを評価形式で効率的に計算できる。 このトリックは、$ q(X)を評価形式で計算するために必要
ドメイン外の点で評価形式の多項式を評価する
係数形式の多項式で出来ることの中に、評価形式では簡単に実現できないことがある。それは、任意の点で評価すること
しかし、領域外の点zでfを評価するためには、まず係数形式に変換しなければならないのではないか?
そこで登場するのが、いわゆる偏心式。ここでは、ラグランジュ補間を用いてこの公式を導く方法を紹介する
$ f(z)=\sum^{d-1}_{i=0}{f_il_i(z)}=\sum^{d-1}_{i=0}{\frac{ω^i}{d}}{\frac{A(z)}{z-ω^i}}= \frac{A(z)}{d}\sum^{d-1}_{i=0}{f_i}{\frac{ω^i}{z-ω^i}}=\frac{z^d-1}{d}\sum^{d-1}_{i=0}{f_i}{\frac{ω^i}{z-ω^i}}
最後の部分は、わずかO(d)ステップで計算できるので、この式は、係数形式に変換せずに$ g(t)や$ h(t)を計算する場合などに非常に便利